「学习总结」正睿 计数选讲

📄 PDF 📝 Source

wzy哥哥的一些有趣计数题~

例题壹

给定 n,mn, m ,构造 nn 堆石子,每堆石子的数量 [1,2m1]\in[1, 2^m-1],每堆石子数目互不相同。求使得 Nim 先手必胜的构造方案数。

n107,m109n\le 10^7, m\le 10^9 模数:109+710^9 + 7

考虑直接后手必胜的情况,即长度为 nn 的序列,异或和为 00

设长度为 nn 的方案数为 f(n)f(n)。能够得到如下递推式: f(n)=(2m1)(2m2)(2m3)(2mn+1)f(n1)(2m1)(i1)f(n2) f(n) = (2^m-1)(2^m-2)(2^m-3) \cdots(2^m - n+1)\\ -f(n - 1)\\ -(2^m-1)(i-1)f(n-2) 考虑到前 (n1)(n-1) 位置个随意填上互不相同的值域为 [1,2m1][1, 2^m-1] 的数字。然后减去前面正好填出异或和为 00 的方案(因为最后一个位置还要填数字)(即:f(n1)f(n-1))。理论上,最后一个数字应该等于前面 (n1)(n - 1) 数字的异或和,但是可能不满足互不相同的条件,先枚举不合法的方案最后一个数字是什么,然后枚举和前面哪一个冲突,再乘上 f(n2)f(n-2)

例题贰

给出 nn 个正整数 aia_i,选出 nn 个正整数 bib_inn 个正整数 did_i,满足

i[1,n],dibiai\forall i \in [1, n], d_i|b_i|a_i,求有多少种选法满足 indi2i=1nbi\prod_{i}^n d_i^2 \ge \prod_{i=1}^{n}b_i

n100,ai109n\le 100, a_i \le 10^9​

对于任意一种方案 i=1ndi2>i=1nbi\prod_{i=1}^{n}d_i^2 > \prod_{i=1}^{n}b_i​

试想把所有 did_i 取成 bidi\frac{b_i}{d_i},即: i=1nbi2di2>i=1nbi\prod_{i=1}^{n} \frac{b_i^2}{d_i^2} > \prod_{i=1}^{n}b_i

即: i=1ndi2<i=1nbi\prod_{i=1}^{n}d_i^2 < \prod_{i=1}^{n}b_i​

所以其实 i=1ndi2<i=1nbi\prod_{i=1}^{n}d_i^2 < \prod_{i=1}^{n}b_ii=1ndi2>i=1nbi\prod_{i=1}^{n}d_i^2 > \prod_{i=1}^{n}b_i 的方案是一一对应的。

只需要求出 i=1ndi2=bi\prod_{i=1}^{n}d_i^2=b_i 的方案数即可。这个可以对每一个质因子单独 dp。

例题叁

CF383D

nn 个位置排成一排,有 mm 个人依次进场选位置,每个人一开始选一个方向,从左到右/从右到左,并选择一个位置,然后按照她选择的方向进入场地,走到这个位置,如果有人,就继续按当前方向往后寻找,知道找到一个空位坐下,如果没有空位,他就会生气.

为每个人确定一个方向和选择的位置。求没有人生气的方案数。

考虑把序列首尾之间连接一个点 n+1n+1 转化成一个环,相当于每个人选择一个位置,然后选择一个方向转圈,方案不合法,当且仅当有一个人占据了 n+1n+1 这个位置。

因为是一个环,所以任意一个位置都是等价的,所以任意一个位置有人的概率为 (1mn+1)(1 -\frac{m}{n+1})​

答案就是 (1mn+1)2m(n+1)m(1 - \frac{m}{n + 1})2^m(n + 1) ^ m

例题肆

「杂题记录」「CTSC2017」吉夫特

例题伍

「杂题记录」括号序列(格路计数)

例题陆

一棵树,每条边的两个端点的大小关系给出,形如 au>ava_u > a_v 或者 au<ava_u < a_v。求有多少种满足条件的排列 aan5000n \le 5000

例题柒

给定一个字符串 SS,仅包含 <> 两种字符。

你需要计算「使得 pi<pi+1p_i < p_{i+1} 当且仅当 sis_i< 的排列 p1,p2,pn+1p_1, p_2, \cdots p_{n+1} 」的数量。

可以发现,答案可能很大,因此你只要输出它对 998244353998244353 取模的结果。

巧妙容斥。

先不考虑所有 > 的限制,只考虑 < 的限制,> 处的偏序关系任意,将一段 < 视为连续的一段,设每一连续的一段长度为 aia_i ,这样的方案数就是 n!iai!\frac{n!}{\prod_{i}a_i!}

然后显然答案需要减去任意位置为 < 的情况,对这个 < 满足数量容斥即可。

考虑设 f(n)f(n) 表示只考虑前 nn 个数字方案数。

考虑 f(n)f(n) 的答案和 f(n1)f(n-1) 的答案的差别,枚举最后一段有多长即可。 f(n)=i=1i1[Sj=>](ij)!f(i)(1)cnti1cntj f(n) = \sum_{i=1}^{i-1}\frac{[S_j = '>']}{(i-j)!}f(i)(-1)^{cnt_{i-1}-cnt_{j}} 这东西可以分治 NTTNTT​ 优化。

例题玐

nn循环矩阵是一种形如: A=[a0an1a2a1a1a0an1a2a1a0an2an1an1an2a1a0] A=\begin{bmatrix} a_0 & a_{n-1} &\cdots & a_2 & a_1\\ a_1 & a_{0} &a_{n-1} & & a_2\\ \vdots & a_1 &a_0 & \ddots & \vdots\\ a_{n-2} & &\ddots & \ddots & a_{n-1}\\ a_{n-1} & a_{n-2} &\cdots & a_1 & a_0 \end{bmatrix} 的矩阵。

f(x)=i=0n1aixif(x)=\sum_{i=0}^{n-1}a_ix^i 没必要拘泥于aia_i 的下标,取第一行依次排开即可,是等价的。

则:det(A)=i=0n1f(ωi)\det(A)=\prod_{i=0}^{n-1}\limits{f(\omega_i)}

即 对于循环矩阵,有快速的求值方式。

LGV引理

在一张 DAG 上,给定 nn 个起点 a1,,ana_1,\cdots,a_nnn 个终点 b1,,bnb_1,\cdots,b_n,求选出 nn 条路径 (ai,bi)(a_i, b_i)​ 互不相交(不经过同一个点)的方案数。

f(a,b)f(a, b) 表示从 DAG 上从 aa 走到 bb 的方案数。

构造矩阵 CC, 满足 ca,b=f(a,b)c_{a, b}=f(a, b)

LGV引理指出,其方案数为: det(C) \det(C) 考虑任意一个有交方案,都能够对应一种其他方案,对应奇偶排列,这些方案会被抵消。

栗题

Y\mathbb{Y} 轴正半轴上有 nn 个点 (0,a1),(0,a2),,(0,an)(0, a_1),(0, a_2), \cdots,(0, a_n),他们每次可以向右或向下走一格,求最后分别走到 (1,0),(2,0),,(n,0)(1, 0), (2, 0), \cdots, (n, 0) 的方案数。 n,ai106n, a_i \le 10^6

考虑这里的从 (0,ai)(0, a_i)(j,0)(j, 0) 的方案数为 (ai+jj)\dbinom{a_i + j}{j}

构造行列式为: (a1+11)(a1+nn)(an+11)(an+nn) \begin{vmatrix} \dbinom{a_1+1}{1}&\cdots&\dbinom{a_1+n}{n}\\ \vdots & \ddots& \vdots\\ \dbinom{a_n+1}{1}&\cdots&\dbinom{a_n+n}{n} \end{vmatrix} 对于每一列 jj 提出公因子 1j!\frac{1}{j!}​,得: 11! 2!n!(a1+1)1(a1+n)n(an+1)1(an+1)n \frac{1}{1!\ 2!\cdots n!}\begin{vmatrix} (a_1+1)^{\underline{1}}&\cdots&(a_1+n)^{\underline{n}}\\ \vdots & \ddots& \vdots\\ (a_n+1)^{\underline{1}}&\cdots&(a_n+1)^{\underline{n}} \end{vmatrix} 对每一行 ii 提出公因子 (ai+1)(a_i+1) 得到: (a1+1)(a2+1)(an+1)1! 2!n!1(a1+n)n11(an+1)n1 \frac{(a_1+1)(a_2+1)\cdots(a_n+1)}{1!\ 2!\cdots n!} \begin{vmatrix} 1&\cdots&(a_1+n)^{\underline{n-1}}\\ \vdots & \ddots& \vdots\\ 1&\cdots&(a_n+1)^{\underline{n-1}} \end{vmatrix} 类似于归纳法的消元方法,注意到每一列都是一系列形式相同的关于 aia_i 的多项式,考虑可以用前面的每一列来消这一列,使得这一列 ii 只剩下第 ii 次项。

最后能得到一个范德蒙行列式,形如: F=1a1a12a1n11anan2ann1 F=\begin{vmatrix} 1 & a_1 & a_1^2 & \cdots & a_1^{n-1} \\ \vdots & & &\ddots &\vdots\\ 1 & a_n & a_n^2 & \cdots & a_n^{n-1} \\ \end{vmatrix} 范德蒙行列式的值有如下结论: det(F)=i<j(ajai) \det(F)=\prod_{i < j}(a_j - a_i) 注意按照归纳法推导过程,不难发现其实应该会推导出一个 αF\alpha F 的形式,但是这里的 α\alpha 的值为 11​ ,可以忽略。

可以考虑枚举差值 kk ,计算有多少对数字差值为 kk

gig_i 表示有多少 aa 等于 ii,构造 gig_i 的生成函数 G(x)G(x)

易知:[xk]i=kgigik[x^k]\sum_{i=k}\limits{g_ig_{i-k}} 就是所求。复杂度为 O(ailogai)\mathcal{O}(a_i \log a_i)